package com.mofum.cloud.utils;

import com.mofum.cloud.core.error.utils.IDException;

import java.math.BigInteger;
import java.util.UUID;

/**
 * ID 生成器
 *
 * @author yumi@omuao.com
 */
public interface IDUtils {
    /**
     * 获取ID实例
     *
     * @return ID工具类
     * @throws IDException 异常
     */
    static IDUtils getInstance() throws IDException {
        return getInstance(null);
    }

    /**
     * 获取ID实例
     *
     * @param clazz<?> 类
     * @return ID工具类
     * @throws IDException 异常
     */
    static IDUtils getInstance(Class<?> clazz) throws IDException {
        if (clazz != null && IDUtils.class.isAssignableFrom(clazz)) {
            IDUtils idUtils = null;
            try {
                idUtils = (IDUtils) clazz.newInstance();
            } catch (InstantiationException e) {
                throw new IDException(e.getMessage(), e.getCause());
            } catch (IllegalAccessException e) {
                throw new IDException(e.getMessage(), e.getCause());
            }
            return idUtils;
        }

        IDUtils idUtils = new IDUtils() {
        };
        if (clazz != null && IDUtils.class.equals(clazz)) {
            return idUtils;
        }

        if (clazz == null) {
            return idUtils;
        }
        throw new IDException(clazz.getCanonicalName() + " is not support!");
    }

    /**
     * 下一个ID
     *
     * @return id
     */
    default long nextLong() {
        return System.nanoTime();
    }

    /**
     * 下一个ID
     *
     * @return id
     */
    default BigInteger nextBigInteger() {
        return BigInteger.valueOf(nextLong());
    }

    /**
     * 下一个ID
     *
     * @return id
     */
    default String nextString() {
        return UUID.randomUUID().toString();
    }

}
